package cn.itsource.rate;

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

@Slf4j
public class DefaultRateLimitServiceImpl implements RateLimitService {

	@Resource
	private StringRedisTemplate stringRedisTemplate;


	@Override
	public Boolean limit(String ip, String uri, RateLimit rateLimit) {
//		log.info("默认的实现,请自定义实现类覆盖当前实现");
		String key = "rate:" + ip + ":" + uri;
		// 缓存中存在key，在限定访问周期内已经调用过当前接口
		if (stringRedisTemplate.hasKey(key)) {
			// 访问次数自增1
//			redisTemplate.opsForValue().increment(key, 1);
			String num = stringRedisTemplate.opsForValue().get(key);

			Integer integer = new Integer(num);
			integer = integer+1;
			// 超出访问次数限制
			if ( integer > rateLimit.number()) {
//				stringRedisTemplate.opsForValue().set(key, integer.toString(),rateLimit.cycle(), TimeUnit.SECONDS);
				return false;
			}
			// 未超出访问次数限制，不进行任何操作，返回true
		} else {
			// 第一次设置数据,过期时间为注解确定的访问周期
			stringRedisTemplate.opsForValue().set(key, "1", rateLimit.cycle(), TimeUnit.SECONDS);
		}
		return true;
	}
}
